/*
 * File:   ServerClientProtocol.h
 * Author: wilq
 *
 * Created on June 13, 2012, 7:41 PM
 */

#ifndef SERVERCLIENTPROTOCOL_H
#define	SERVERCLIENTPROTOCOL_H

#include "BaseServerProtocol.h"
using namespace CSDatabaseLib;

class ServerClientProtocol : public virtual BaseServerProtocol {
public:
    /** Konstruktor podstawowy 
	 * @param s wskaźnik na socket.
	 */
    ServerClientProtocol(socket_ptr s);
    virtual ~ServerClientProtocol();

	/**Metoda zwraca identyfikator klienta*/
    inline uint32_t GetClientId() {
        return connectedUserId;
    }

	/**Metoda zwraca następny wolny identyfikator uchwytu*/
    inline uint32_t GetNextHandle() {
        return ++m_handleId;
    }
private:
    /**
     * Obsługa zdarzenia użytkownika - autoryzacji
     * Format pakietu wejściowego:
     * 		string - nazwa użytkownika
     *          string - hasło użytkownika
     * 
     * Format pakietu wyjściowego:
     *          int32 - identyfikator użytkownika
     * @param request pakiet z żądaniem danych
     */
    void OnUserAuthorization(const NetworkPacket &request);
    
    /**
     * Obsługa zdarzenia użytkownika - zmiany hasła
     * Format pakietu wejściowego:
     * 		string - nazwa użytkownika
     *          string - hasło użytkownika
     * 
     * Format pakietu wyjściowego:
     *          int32 - identyfikator użytkownika
     * @param request pakiet z żądaniem danych
     */
    void OnUserChangePassword(const NetworkPacket &request);
    
     /**
     * Obsługa zdarzenia użytkownika - pobrania plików w katalogu
     * Format pakietu wejściowego:
     * 		uint32 - identyfikator folderu
     * 
     * Format pakietu wyjściowego:
     *          List<Files> - list plików
     * @param request pakiet z żądaniem danych
     */
    void OnUserGetFilesInDir(const NetworkPacket & request);
    
    /**
     * Obsługa zdarzenia użytkownika - pobierania folderów w katalogu
     * Format pakietu wejściowego:
     * 		uint32 - identyfikator katalogu
     * 
     * Format pakietu wyjściowego:
     *          List<Folder> - list folderów 
     * @param request pakiet z żądaniem danych
     */
    void OnUserGetFoldersInDir(const NetworkPacket & request);

    /**
     * Obsługa zdarzenia użytkownika - czytania z pliku
     * Format pakietu wejściowego:
     * 		uint32 - identyfikator pliku
     *          uint32 - ilość pobieranych danych
     * 
     * Format pakietu wyjściowego:
     *          byte[] - odczytane dane
     * @param request pakiet z żądaniem danych
     */
    void OnUserReadFile(const NetworkPacket & request);
    
    /**
     * Obsługa zdarzenia użytkownika - czytania z pliku
     * Format pakietu wejściowego:
     * 		uint32 - identyfikator pliku
     *          uint32 - ilość zapisywanych danych
     *          byte[] - dane do zapisania
     * 
     * Format pakietu wyjściowego:
     *          int32 - status operacji
     * @param request pakiet z żądaniem danych
     */
    void OnUserWriteFile(const NetworkPacket & request);
    
    /**
     * Obsługa zdarzenia użytkownika - tworzenia katalogu
     * Format pakietu wejściowego:
     * 		uint32 - identyfikator katalogu w którym zostanie stworzony folder
     *          string - nazwa katalogu
     * 
     * Format pakietu wyjściowego:
     *          uint32 - identyfikator stworzonego katalogu
     * @param request pakiet z żądaniem danych
     */
    void OnUserMakeDirectory(const NetworkPacket & request);
    
    /**
     * Obsługa zdarzenia użytkownika - usuwania katalogu
     * Format pakietu wejściowego:
     * 			uint32 - identyfikator katalogu w który zostanie usunięty
     *          string - nazwa katalogu
     * 
     * Format pakietu wyjściowego:
     *          uint32 - status operacji
     * @param request pakiet z żądaniem danych
     */
    void OnUserDeleteDirectory(const NetworkPacket & request);

    /**
     * Obsługa usuwania katalogu
     * Format pakietu wejściowego:
     * 			uint32 - identyfikator katalogu w który zostanie usunięty
     *          string - nazwa katalogu
     * 
     * Format pakietu wyjściowego:
     *          uint32 - identyfikator stworzonego katalogu
     */
    int32_t RemoveDirectory(uint32_t folderId);
    
    /**
     * Obsługa usuwania katalogu w magazynie
     * Format pakietu wejściowego:
     * 		uint32 - identyfikator katalogu w który zostanie usunięty
     *          string - nazwa katalogu
     * 
     * Format pakietu wyjściowego:
     *          uint32 - identyfikator stworzonego katalogu
     */
    int32_t RemoveDirectoryOnStorage(uint32_t folderId, uint32_t storageId);

    /**
     * Obsługa zdarzenia użytkownika - zmiany nazwy pliku
     * Format pakietu wejściowego:
     * 		uint32 - identyfikator pliku który zostanie zmieniony
     *          string - nowa nazwa pliku
     * 
     * Format pakietu wyjściowego:
     *          uint32 - status operacji
     * @param request pakiet z żądaniem danych
     */
    void OnUserRenameFile(const NetworkPacket & request);
    
    /**
     * Obsługa zdarzenia użytkownika - zmiany nazwy użytkownika
     * Format pakietu wejściowego:
     * 		uint32 - identyfikator katalogu w który zostanie usunięty
     *          string - nazwa katalogu
     * 
     * Format pakietu wyjściowego:
     *          uint32 - status operacji
     * @param request pakiet z żądaniem danych
     */
    void OnUserRenameDirectory(const NetworkPacket & request);

    //void OnUserChmod(const NetworkPacket & request);
    //void OnUserChown(const NetworkPacket & request);

    /**
     * Obsługa zdarzenia użytkownika - dodanie nowego użytkownika
     * Format pakietu wejściowego:
     * 		string - nazwa użytkownika
     *          string - hasło użytkownika
     * 
     * Format pakietu wyjściowego:
     *          uint32 - status operacji
     * @param request pakiet z żądaniem danych
     */
    void OnUserAddUser(const NetworkPacket & request);
    
    /**
     * Obsługa zdarzenia użytkownika - usuwanie użytkownika
     * Format pakietu wejściowego:
     * 		uint32 - identyfikator użytkownika
     * 
     * Format pakietu wyjściowego:
     *          uint32 - status operacji
     * @param request pakiet z żądaniem danych
     */
    void OnUserRemoveUser(const NetworkPacket & request);
    
    /**
     * Obsługa zdarzenia użytkownika - pobranie listy użytkowników
     * Format pakietu wejściowego:
     * 		brak
     * 
     * Format pakietu wyjściowego:
     *          List<User> - lista użytkowników
     * @param request pakiet z żądaniem danych
     */
    void OnUserGetUsersList(const NetworkPacket & request);

    /**
     * Obsługa zdarzenia użytkownika - dodanie grupy
     * Format pakietu wejściowego:
     * 		string - nazwa grupy
     * 
     * Format pakietu wyjściowego:
     *          uint32 - identyfikator grupy
     * @param request pakiet z żądaniem danych
     */
    void OnUserAddGroup(const NetworkPacket & request);
    
    /**
     * Obsługa zdarzenia użytkownika - usunięcie grupy
     * Format pakietu wejściowego:
     * 		uint32 - identyfikator grupy
     * 
     * Format pakietu wyjściowego:
     *          uint32 - status operacji
     * @param request pakiet z żądaniem danych
     */
    void OnUserRemoveGroup(const NetworkPacket & request);
    
    /**
     * Obsługa zdarzenia użytkownika - pobranie listy grup
     * Format pakietu wejściowego:
     * 		brak
     * 
     * Format pakietu wyjściowego:
     *          List<Group> - lista grup
     * @param request pakiet z żądaniem danych
     */
    void OnUserGetGroupsList(const NetworkPacket & request);

    /**
     * Obsługa zdarzenia użytkownika - dodania magazynu
     * Format pakietu wejściowego:
     * 		string - nazwa magazynu
     *          string - klucz
     * Format pakietu wyjściowego:
     *          uint32 - identyfikator dodanego magazynu
     * @param request pakiet z żądaniem danych
     */
    void OnUserAddStorage(const NetworkPacket & request);
    
    /**
     * Obsługa zdarzenia użytkownika - usuwania magazynu
     * Format pakietu wejściowego:
     * 		uint32 - identyfikator usuwanego magazynu
     * Format pakietu wyjściowego:
     *          int32 - status operacji 
     * @param request pakiet z żądaniem danych
     */
    void OnUserRemoveStorage(const NetworkPacket & request);
    
    /**
     * Obsługa zdarzenia użytkownika - zmiana klucza magazynu
     * Format pakietu wejściowego:
     * 		uint32 - identyfikator magazynu
     *          string - nowe hasło
     * Format pakietu wyjściowego:
     *          int32 - status operacji 
     * @param request pakiet z żądaniem danych
     */
    void OnUserChangeStorageKey(const NetworkPacket & request);
    
    /**
     * Obsługa zdarzenia użytkownika - pobranie listy magazynów
     * Format pakietu wejściowego:
     * 		brak parametrów
     * Format pakietu wyjściowego:
     *          List<Storage> - lista magazynów
     * @param request pakiet z żądaniem danych
     */
    void OnUserGetStoragesList(const NetworkPacket & request);

	 /** Obsługa udostępniania zasobów
	  *
	  * Format pakietu wejściowego:
      * 		string - virtual path
      * 		string - storage path
      * 		string - storage name
      * 		bool - force (forces replace or join exists element)
	  * Format pakietu wyjściowego
	  *         bool - true if success
	  * @param request pakiet z żądaniem danych
      */
    void OnShare(const NetworkPacket & request);

	 /** Obsługa żądania przerywania udostępniania zasobów
	  *
	  * Format pakietu wejściowego:
      * 		string - virtual path
      *         bool - force remove
	  * Format pakietu wyjściowego
	  *         bool - true if success
	  * @param request pakiet z żądaniem danych
      */
    void OnUnShare(const NetworkPacket & request);

	 /** Obsługa żądania sprawdzenia czy plik istnieje
	  *
	  * Format pakietu wejściowego:
      * 		string - virtual path
	  * Format pakietu wyjściowego
	  *         bool - true if exists
	  * @param request pakiet z żądaniem danych
      */
    void OnFileExists(const NetworkPacket & request);

	 /** Obsługa żądania otwarcia pliku
	  *
	  * Format pakietu wejściowego:
      * 		string - virtual path
	  *         string - mode (a, w, r+)
	  * Format pakietu wyjściowego
	  *         uint32 - uchwyt pliku
	  * @param request pakiet z żądaniem danych
      */
    void OnFileOpen(const NetworkPacket & request);

	 /** Obsługa żądania zamknięcia pliku
	  *
	  * Format pakietu wejściowego:
      * 		uint32 - uchwyt pliku
	  * Format pakietu wyjściowego
	  *         bool - status
	  * @param request pakiet z żądaniem danych
      */
    void OnFileClose(const NetworkPacket & request);

	 /** Obsługa żądania dodatkowych informacji o pliku
	  *
	  * Format pakietu wejściowego:
      * 		uint32 - uchwyt pliku
	  *         uint8_t - typ  danych 0 - size, 1 - timestamp, 2 - position
	  * Format pakietu wyjściowego
	  *         uint64_t - dane w zależności od typu
	  * @param request pakiet z żądaniem danych
      */
    void OnFileInfo(const NetworkPacket & request);

	 /** Obsługa żądania ustawienia kursora pliku
	  *
	  * Format pakietu wejściowego:
      * 		uint32 - uchwyt pliku
	  *         int64 - pozycja
	  * Format pakietu wyjściowego
	  *         bool - status
	  * @param request pakiet z żądaniem danych
      */
    void OnFileSeek(const NetworkPacket & request);

	 /** Obsługa żądania sprawdzenia końca pliku 
	  *
	  * Format pakietu wejściowego:
      * 		uint32 - uchwyt pliku
	  * Format pakietu wyjściowego
	  *         bool - status
	  * @param request pakiet z żądaniem danych
      */
    void OnFileEof(const NetworkPacket & request);

	 /** Obsługa żądania wpisania danych do pliku
	  *
	  * Format pakietu wejściowego:
      * 		uint32 - uchwyt pliku
	  *         uint8_t* - data
	  * Format pakietu wyjściowego
	  *         uint32 - data wrote
	  * @param request pakiet z żądaniem danych
      */
    void OnFileWrite(const NetworkPacket & request);

	 /** Obsługa żądania odczytania danych z pliku
	  *
	  * Format pakietu wejściowego:
      * 		uint32 - uchwyt pliku
	  *         uint32_t - data to read
	  * Format pakietu wyjściowego
	  *         uint8_t* - data
	  * @param request pakiet z żądaniem danych
      */
    void OnFileRead(const NetworkPacket & request);

	 /** Obsługa żądania usunięcia pliku 
	  *
	  * Format pakietu wejściowego:
      * 		string - wirtualna ścieżka do pliku
	  * Format pakietu wyjściowego
	  *         bool - status
	  * @param request pakiet z żądaniem danych
      */
    void OnFileDelete(const NetworkPacket & request);
private:
    void _AddHandlers();
    uint32_t connectedUserId;
    uint32_t m_handleId;


};

#endif	/* SERVERCLIENTPROTOCOL_H */

